
import { HashAlgorithm } from '../types';

/**
 * 字符串哈希选项
 * @interface StringHashOptions
 * @property {string} str - 输入字符串
 * @property {HashAlgorithm} algorithm - 哈希算法
 */
export interface StringHashOptions {
  /**
   * 要计算哈希的输入字符串
   */
  str: string;
  /**
   * 要使用的哈希算法
   */
  algorithm: HashAlgorithm;
}

/**
 * ArrayBuffer哈希选项
 * @property {ArrayBuffer} arrayBuffer - 输入数据
 * @property {HashAlgorithm} algorithm - 哈希算法
 */
export interface ArrayBufferHashOptions {
  /**
   * 要计算哈希的二进制数据
   */
  arrayBuffer: ArrayBuffer;
  /**
   * 要使用的哈希算法
   */
  algorithm: HashAlgorithm;
}

/**
 * Blob哈希选项
 * @interface BlobHashOptions
 * @property {Blob} blob - 要计算哈希的Blob对象
 * @property {HashAlgorithm} algorithm - 哈希算法
 * @property {number} [chunkSize=1024*1024] - 分块大小(字节)，默认1MB
 * @property {(progress: number) => void} [onProgress] - 进度回调函数，参数为当前进度(0-100)
 */
export interface BlobHashOptions {
  /**
   * 要计算哈希的Blob对象（通常是文件）
   */
  blob: Blob;
  /**
   * 要使用的哈希算法
   */
  algorithm: HashAlgorithm;
  /**
   * 分块处理时的块大小(字节)，默认1MB
   */
  chunkSize?: number;
  /**
   * 哈希计算进度回调函数，参数为当前进度百分比(0-100)
   */
  onProgress?: (progress: number) => void;
}

/**
 * 加密适配器接口
 * @interface AdapterInterface
 * @description 定义所有加密适配器需要实现的方法
 */
export interface AdapterInterface {

  /**
   * 计算ArrayBuffer哈希值
   * @param {ArrayBufferHashOptions} options - ArrayBuffer哈希选项
   * @returns {Promise<string>} 哈希值（十六进制字符串）
   */
  arrayBufferHash(options: ArrayBufferHashOptions): Promise<string>;

  /**
   * 计算Blob对象哈希值
   * @param {BlobHashOptions} options - Blob哈希选项
   * @returns {Promise<string>} 哈希值（十六进制字符串）
   * @description 对于大文件，会自动分块处理并支持进度回调
   */
  blobHash(options: BlobHashOptions): Promise<string>;

  /**
   * 计算字符串哈希值
   * @param {StringHashOptions} options - 字符串哈希选项
   * @returns {Promise<string>} 哈希值（十六进制字符串）
   */
  stringHash(options: StringHashOptions): Promise<string>;
}